package io;

import java8.User;

import java.io.*;

public class SerializableDeepCopy {

    /**
     ObjectOutputStream：用于将对象序列化为字节流的输出流。
     ObjectInputStream：用于将字节流反序列化为对象的输入流。
     writeObject()：将对象序列化为字节流并写入输出流中的方法。
     readObject()：从输入流中读取字节流并反序列化为对象的方法。
     Serializable接口：通过实现该接口，可以指示一个类是可序列化的。
     */

    /**
     * 对对象进行深拷贝。
     *
     * 通过序列化和反序列化实现对象的深拷贝。此方法适用于需要完全独立副本的情况，例如，不希望原始对象和副本共享任何内部状态。
     *
     * @param object 需要进行深拷贝的对象。
     * @return 对象的深拷贝结果。
     * @throws IOException 如果序列化过程中发生IO异常。
     * @throws ClassNotFoundException 如果反序列化过程中找不到类定义。
     */
    public static Object deepCopy(Object object) throws IOException, ClassNotFoundException {
        // 创建ByteArrayOutputStream实例，用于序列化对象。
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        // 创建ObjectOutputStream实例，用于将对象写入ByteArrayOutputStream。
        ObjectOutputStream oo = new ObjectOutputStream(bo);
        // 将对象写入OutputStream，实现序列化。
        oo.writeObject(object);

        // 创建ByteArrayInputStream实例，用于从序列化后的字节数组中读取数据。
        ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
        // 创建ObjectInputStream实例，用于从ByteArrayInputStream中读取序列化对象。
        ObjectInputStream oi = new ObjectInputStream(bi);

        // 从InputStream中读取对象，实现反序列化，得到对象的深拷贝。
        return oi.readObject();
    }


    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User user = new User();
        user.setAge(18);
        user.setName("went");
        user.setNo(1212L);
        System.out.println(user);
        User o = (User) deepCopy(user);
        System.out.println(o);
        System.out.println(o.getName());
    }
}
